package novel.core.common.respond;

import java.util.List;

/**
 * 分页响应数据格式封装
 * 页码-每页大小-总记录数-数据集
 * @param <T>
 */
/*
为什么响应类与请求类不同?
为什么响应类使用泛型?该泛型是什么?是否对数据的再包装?
响应类属性为什么使用常量,对接收的数据是否无法更改?
List<? extends T>的用法可行?T是实体类?还是抽象类?
of 方法是静态工厂方法?静态工厂方法的作用?
是否使用@Data注解?生成构造函数无注释的处理办法
本类无实际作用,只用于封装,对不同数据进行类形式统一
如果不使用@Data进行补充,那么是否影响类的自动注入实现?
静态方法of的使用?
为什么要获取分页数
*/


public class PageRespDto<T> {

    /**
     * 页码
     */
    private final long pageNum;

    /**
     * 每页大小
     */
    private final long pageSize;

    /**
     * 总记录数
     */
    private final long total;

    /**
     * 分页数据集
     */
    private final List<? extends T> list;

    /**
     * 构造函数,用于通用分页查询场景
     * 接收普通分页数据和普通集合
     * 分页数据{分页信息,数据}
     * @param pageNum
     * @param pageSize
     * @param total
     * @param list
     */
    public PageRespDto(long pageNum, long pageSize, long total, List<? extends T> list) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.total = total;
        this.list = list;
    }

    /**
     * 静态方法of 表示从给定参数创建一个新的分页响应 DTO 对象
     * @param pageNum
     * @param pageSize
     * @param total
     * @param list
     * @return
     * @param <T>
     */
    public static <T> PageRespDto<T> of(long pageNum, long pageSize, long total, List<T> list){
        return new PageRespDto<>(pageNum,pageSize,total,list);}

    /**
     * 获取分页数
     */
    public long getPages() {

        // 零除错误,防止每页大小为零情况
        if (this.pageSize==0L) {
            return 0L;
        }else{
            // long pages = this.total/this.pageSize;
            // 优化,向上取整;两个数相除(a + b - 1) / b。
            long pages = (this.total+this.pageSize-1L)/this.pageSize;
            return pages;
    }

}

}